package cn.mujiankeji.mbrowser.界面.框架.主视图

import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import cn.mujiankeji.mbrowser.数据.枚举类.页面状态枚举
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import java.util.UUID

/**
 * 代表单个标签页状态的基础接口。
 * 完全遵循 doc/标签页规范.md 中的 TabState 接口定义。
 * 注意：原文件中 `标签页状态` 接口名与此类似，但属性有差异。
 */
@Stable
abstract class 标签页状态 {

    open val 标识 : String = UUID.randomUUID().toString()
    
    // 使用惰性初始化，只有在真正需要时才创建MutableStateFlow实例
    // 基本属性，所有标签页都需要的
    private val _标题 by lazy { MutableStateFlow<String?>("") }
    open val 标题: MutableStateFlow<String?> get() = _标题
    
    private val _地址 by lazy { MutableStateFlow<String?>("") }
    open val 地址: MutableStateFlow<String?> get() = _地址
    
    private val _图标 by lazy { MutableStateFlow<String?>("") }
    open val 图标: MutableStateFlow<String?> get() = _图标
    
    private val _加载进度 by lazy { MutableStateFlow(0) } // 0-100
    open val 加载进度: MutableStateFlow<Int> get() = _加载进度
    
    private val _状态 by lazy { MutableStateFlow(页面状态枚举.初始化) }
    open val 状态: MutableStateFlow<页面状态枚举> get() = _状态

    open val 创建时间戳: Long = System.currentTimeMillis()
    private val _最后访问时间戳 by lazy { MutableStateFlow(创建时间戳) }
    open val 最后访问时间戳: StateFlow<Long> get() = _最后访问时间戳

    var 关键词 by mutableStateOf<String?>(null)

    protected fun 更新最后访问时间戳(时间戳: Long) {
        _最后访问时间戳.value = 时间戳
    }

    // 非必须的状态，可以在子类中按需重写
    open var 可否添加收藏 : Boolean = false
    
    open fun 添加收藏(){}

    // 导航相关状态
    private val _可否后退 by lazy { MutableStateFlow(false) }
    open val 可否后退: MutableStateFlow<Boolean> get() = _可否后退
    
    private val _可否前进 by lazy { MutableStateFlow(false) }
    open val 可否前进: MutableStateFlow<Boolean> get() = _可否前进

    // 基本操作方法
    open fun 前进() : Boolean = false // 前进后退，为true，标签页内部消化后退
    open fun 后退() : Boolean = false
    open fun 刷新(){}
    open fun 界面恢复(){}
    open fun 界面暂停(){}
    open fun 界面销毁(){}

}